#ifndef SCREEN_H_
#define SCREEN_H_

#include "main.h"
#include <stdint.h>
#include <string.h>

#define BUFFER_SIZE 			100  // 缓冲区大小
// 通信协议宏定义
#define PROTOCOL_HEADER1		0x5A
#define PROTOCOL_HEADER2		0xA5
#define PROTOCOL_CMD_WRITE 		0x82 // 写入命令
#define FRAME_LEN_SHORT 		0x05 // 短帧长度（如ScreenInit中的帧）
#define FRAME_LEN_LONG 			0x07 // 长帧长度（如SendData中的帧）
// 串口屏变量地址
#define DATA_ADDR		0x20
#define NUM_ADDR		0x2C
#define MAX_ADDR		0x22
#define MIN_ADDR		0x24
#define MEAN_ADDR		0x26
#define STD_ADDR		0x28
#define TESTTIMES_ADDR	0x2A
#define MODE 			0x18
#define TEXTTIME		0x2B
#define MEMBRANE 		0x2E
// 上位机软件定义地址
#define SOFT_DATA_ADDR	0x20
#define SOFT_NUM_ADDR	0x30
#define SOFT_MAX_ADDR	0x22
#define SOFT_MIN_ADDR	0x24
#define SOFT_MEAN_ADDR	0x26
#define SOFT_STD_ADDR	0x28
#define SOFT_MODE_ADDR	0x1A
#define SOFT_TIMES_ADDR 0x2A
/*
 * 查询页：
 * DATA_TIMES_ADDR 每次测试后的厚度数据从第一次0x30 0x31 到第50次的0x92 0x93
 * 最大值，最小值，平均值的变量地址同上的测试页
 * 查询页的标准差变量地址为0x94
 *
 * */
#define QUERY_NUM				54	 // 查询页变量数
#define QUERY_START_ADDR 		0x30 // 查询页变量起始地址
#define QUERY_ADDR_STEP			2 	 // 地址递增步长
/********** 关键结构体 存放所有参数 **********/
typedef struct
{
    uint8_t test_gauge_mode; // 测试模式：起始为0，自动，切换为手动为1
    uint8_t test_times_param; // 总共测试次数，手动输入
    uint16_t test_time; // 测试时间
    uint16_t transfer_membrane; // 转膜时间
    int origin_point_param; // 原点
    int test_gauge_param; // 当前次的测试数据
    int min_gauge_param; // 最小值
    int max_gauge_param; // 最大值
    int mean_gauge_param; // 平均值
    int std_gauge_param; // 标准差
    int num_gauge_param; // 当前测试次数
}screen_set_param;

extern screen_set_param screen_set_param_t;
extern int g_RawDataBuf[BUFFER_SIZE];

// 屏幕初始化
void ScreenInit(void);
// 上位机初始化
void LinkStart(void);
// 将模式和实验次数发给屏幕和软件
void PatternTimesSwitching(void);

// 把结构体所有数据写到屏幕
void ScreenSend(void);
// 数据发到软件
void SoftSend(void);

// 单次获取数据
void RecFromOnce(uint8_t mode);
// 根据模式和实验次数运行
void Run(void);

// 发送数据到debug串口
void SendDebug(void);
// 清零
void ScreenSendClear(void);
// 向缓冲区添加新数据
void AddToBuffer(int* newData, uint8_t newCount);
// 往查询界面写入测试数据
void ScreenSendQuery(void);
// 往指定的地址发送数据
uint8_t CommonSendData(UART_HandleTypeDef *huart, uint16_t addr, int data);
uint8_t ScreenSendData(uint16_t addr, int data);
uint8_t SoftSendData(uint16_t addr, int data);
// 参数计算
uint8_t ParameterCalculation(void);

#endif
